<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
<meta name="generator" content="AsciiDoc 8.6.6" />
<title>Release notes for Gerrit 2.3</title>
<style type="text/css">
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */

/* Default font. */
body {
  font-family: Georgia,serif;
}

/* Title font. */
h1, h2, h3, h4, h5, h6,
div.title, caption.title,
thead, p.table.header,
#toctitle,
#author, #revnumber, #revdate, #revremark,
#footer {
  font-family: Arial,Helvetica,sans-serif;
}

body {
  margin: 1em 5% 1em 5%;
}

a {
  color: blue;
  text-decoration: underline;
}
a:visited {
  color: fuchsia;
}

em {
  font-style: italic;
  color: navy;
}

strong {
  font-weight: bold;
  color: #083194;
}

h1, h2, h3, h4, h5, h6 {
  color: #527bbd;
  margin-top: 1.2em;
  margin-bottom: 0.5em;
  line-height: 1.3;
}

h1, h2, h3 {
  border-bottom: 2px solid silver;
}
h2 {
  padding-top: 0.5em;
}
h3 {
  float: left;
}
h3 + * {
  clear: left;
}
h5 {
  font-size: 1.0em;
}

div.sectionbody {
  margin-left: 0;
}

hr {
  border: 1px solid silver;
}

p {
  margin-top: 0.5em;
  margin-bottom: 0.5em;
}

ul, ol, li > p {
  margin-top: 0;
}
ul > li     { color: #aaa; }
ul > li > * { color: black; }

pre {
  padding: 0;
  margin: 0;
}

#author {
  color: #527bbd;
  font-weight: bold;
  font-size: 1.1em;
}
#email {
}
#revnumber, #revdate, #revremark {
}

#footer {
  font-size: small;
  border-top: 2px solid silver;
  padding-top: 0.5em;
  margin-top: 4.0em;
}
#footer-text {
  float: left;
  padding-bottom: 0.5em;
}
#footer-badges {
  float: right;
  padding-bottom: 0.5em;
}

#preamble {
  margin-top: 1.5em;
  margin-bottom: 1.5em;
}
div.imageblock, div.exampleblock, div.verseblock,
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
div.admonitionblock {
  margin-top: 1.0em;
  margin-bottom: 1.5em;
}
div.admonitionblock {
  margin-top: 2.0em;
  margin-bottom: 2.0em;
  margin-right: 10%;
  color: #606060;
}

div.content { /* Block element content. */
  padding: 0;
}

/* Block element titles. */
div.title, caption.title {
  color: #527bbd;
  font-weight: bold;
  text-align: left;
  margin-top: 1.0em;
  margin-bottom: 0.5em;
}
div.title + * {
  margin-top: 0;
}

td div.title:first-child {
  margin-top: 0.0em;
}
div.content div.title:first-child {
  margin-top: 0.0em;
}
div.content + div.title {
  margin-top: 0.0em;
}

div.sidebarblock > div.content {
  background: #ffffee;
  border: 1px solid #dddddd;
  border-left: 4px solid #f0f0f0;
  padding: 0.5em;
}

div.listingblock > div.content {
  border: 1px solid #dddddd;
  border-left: 5px solid #f0f0f0;
  background: #f8f8f8;
  padding: 0.5em;
}

div.quoteblock, div.verseblock {
  padding-left: 1.0em;
  margin-left: 1.0em;
  margin-right: 10%;
  border-left: 5px solid #f0f0f0;
  color: #888;
}

div.quoteblock > div.attribution {
  padding-top: 0.5em;
  text-align: right;
}

div.verseblock > pre.content {
  font-family: inherit;
  font-size: inherit;
}
div.verseblock > div.attribution {
  padding-top: 0.75em;
  text-align: left;
}
/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
div.verseblock + div.attribution {
  text-align: left;
}

div.admonitionblock .icon {
  vertical-align: top;
  font-size: 1.1em;
  font-weight: bold;
  text-decoration: underline;
  color: #527bbd;
  padding-right: 0.5em;
}
div.admonitionblock td.content {
  padding-left: 0.5em;
  border-left: 3px solid #dddddd;
}

div.exampleblock > div.content {
  border-left: 3px solid #dddddd;
  padding-left: 0.5em;
}

div.imageblock div.content { padding-left: 0; }
span.image img { border-style: none; }
a.image:visited { color: white; }

dl {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
dt {
  margin-top: 0.5em;
  margin-bottom: 0;
  font-style: normal;
  color: navy;
}
dd > *:first-child {
  margin-top: 0.1em;
}

ul, ol {
    list-style-position: outside;
}
ol.arabic {
  list-style-type: decimal;
}
ol.loweralpha {
  list-style-type: lower-alpha;
}
ol.upperalpha {
  list-style-type: upper-alpha;
}
ol.lowerroman {
  list-style-type: lower-roman;
}
ol.upperroman {
  list-style-type: upper-roman;
}

div.compact ul, div.compact ol,
div.compact p, div.compact p,
div.compact div, div.compact div {
  margin-top: 0.1em;
  margin-bottom: 0.1em;
}

tfoot {
  font-weight: bold;
}
td > div.verse {
  white-space: pre;
}

div.hdlist {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
div.hdlist tr {
  padding-bottom: 15px;
}
dt.hdlist1.strong, td.hdlist1.strong {
  font-weight: bold;
}
td.hdlist1 {
  vertical-align: top;
  font-style: normal;
  padding-right: 0.8em;
  color: navy;
}
td.hdlist2 {
  vertical-align: top;
}
div.hdlist.compact tr {
  margin: 0;
  padding-bottom: 0;
}

.comment {
  background: yellow;
}

.footnote, .footnoteref {
  font-size: 0.8em;
}

span.footnote, span.footnoteref {
  vertical-align: super;
}

#footnotes {
  margin: 20px 0 20px 0;
  padding: 7px 0 0 0;
}

#footnotes div.footnote {
  margin: 0 0 5px 0;
}

#footnotes hr {
  border: none;
  border-top: 1px solid silver;
  height: 1px;
  text-align: left;
  margin-left: 0;
  width: 20%;
  min-width: 100px;
}

div.colist td {
  padding-right: 0.5em;
  padding-bottom: 0.3em;
  vertical-align: top;
}
div.colist td img {
  margin-top: 0.3em;
}

@media print {
  #footer-badges { display: none; }
}

#toc {
  margin-bottom: 2.5em;
}

#toctitle {
  color: #527bbd;
  font-size: 1.1em;
  font-weight: bold;
  margin-top: 1.0em;
  margin-bottom: 0.1em;
}

div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
  margin-top: 0;
  margin-bottom: 0;
}
div.toclevel2 {
  margin-left: 2em;
  font-size: 0.9em;
}
div.toclevel3 {
  margin-left: 4em;
  font-size: 0.9em;
}
div.toclevel4 {
  margin-left: 6em;
  font-size: 0.9em;
}

span.aqua { color: aqua; }
span.black { color: black; }
span.blue { color: blue; }
span.fuchsia { color: fuchsia; }
span.gray { color: gray; }
span.green { color: green; }
span.lime { color: lime; }
span.maroon { color: maroon; }
span.navy { color: navy; }
span.olive { color: olive; }
span.purple { color: purple; }
span.red { color: red; }
span.silver { color: silver; }
span.teal { color: teal; }
span.white { color: white; }
span.yellow { color: yellow; }

span.aqua-background { background: aqua; }
span.black-background { background: black; }
span.blue-background { background: blue; }
span.fuchsia-background { background: fuchsia; }
span.gray-background { background: gray; }
span.green-background { background: green; }
span.lime-background { background: lime; }
span.maroon-background { background: maroon; }
span.navy-background { background: navy; }
span.olive-background { background: olive; }
span.purple-background { background: purple; }
span.red-background { background: red; }
span.silver-background { background: silver; }
span.teal-background { background: teal; }
span.white-background { background: white; }
span.yellow-background { background: yellow; }

span.big { font-size: 2em; }
span.small { font-size: 0.6em; }

span.underline { text-decoration: underline; }
span.overline { text-decoration: overline; }
span.line-through { text-decoration: line-through; }


/*
 * xhtml11 specific
 *
 * */

tt {
  font-family: monospace;
  font-size: inherit;
  color: navy;
}

div.tableblock {
  margin-top: 1.0em;
  margin-bottom: 1.5em;
}
div.tableblock > table {
  border: 3px solid #527bbd;
}
thead, p.table.header {
  font-weight: bold;
  color: #527bbd;
}
p.table {
  margin-top: 0;
}
/* Because the table frame attribute is overriden by CSS in most browsers. */
div.tableblock > table[frame="void"] {
  border-style: none;
}
div.tableblock > table[frame="hsides"] {
  border-left-style: none;
  border-right-style: none;
}
div.tableblock > table[frame="vsides"] {
  border-top-style: none;
  border-bottom-style: none;
}


/*
 * html5 specific
 *
 * */

.monospaced {
  font-family: monospace;
  font-size: inherit;
  color: navy;
}

table.tableblock {
  margin-top: 1.0em;
  margin-bottom: 1.5em;
}
thead, p.tableblock.header {
  font-weight: bold;
  color: #527bbd;
}
p.tableblock {
  margin-top: 0;
}
table.tableblock {
  border-width: 3px;
  border-spacing: 0px;
  border-style: solid;
  border-color: #527bbd;
  border-collapse: collapse;
}
th.tableblock, td.tableblock {
  border-width: 1px;
  padding: 4px;
  border-style: solid;
  border-color: #527bbd;
}

table.tableblock.frame-topbot {
  border-left-style: hidden;
  border-right-style: hidden;
}
table.tableblock.frame-sides {
  border-top-style: hidden;
  border-bottom-style: hidden;
}
table.tableblock.frame-none {
  border-style: hidden;
}

th.tableblock.halign-left, td.tableblock.halign-left {
  text-align: left;
}
th.tableblock.halign-center, td.tableblock.halign-center {
  text-align: center;
}
th.tableblock.halign-right, td.tableblock.halign-right {
  text-align: right;
}

th.tableblock.valign-top, td.tableblock.valign-top {
  vertical-align: top;
}
th.tableblock.valign-middle, td.tableblock.valign-middle {
  vertical-align: middle;
}
th.tableblock.valign-bottom, td.tableblock.valign-bottom {
  vertical-align: bottom;
}


/*
 * manpage specific
 *
 * */

body.manpage h1 {
  padding-top: 0.5em;
  padding-bottom: 0.5em;
  border-top: 2px solid silver;
  border-bottom: 2px solid silver;
}
body.manpage h2 {
  border-style: none;
}
body.manpage div.sectionbody {
  margin-left: 3em;
}

@media print {
  body.manpage div#toc { display: none; }
}
</style>
<script type="text/javascript">
/*<![CDATA[*/
var asciidoc = {  // Namespace.

/////////////////////////////////////////////////////////////////////
// Table Of Contents generator
/////////////////////////////////////////////////////////////////////

/* Author: Mihai Bazon, September 2002
 * http://students.infoiasi.ro/~mishoo
 *
 * Table Of Content generator
 * Version: 0.4
 *
 * Feel free to use this script under the terms of the GNU General Public
 * License, as long as you do not remove or alter this notice.
 */

 /* modified by Troy D. Hanson, September 2006. License: GPL */
 /* modified by Stuart Rackham, 2006, 2009. License: GPL */

// toclevels = 1..4.
toc: function (toclevels) {

  function getText(el) {
    var text = "";
    for (var i = el.firstChild; i != null; i = i.nextSibling) {
      if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
        text += i.data;
      else if (i.firstChild != null)
        text += getText(i);
    }
    return text;
  }

  function TocEntry(el, text, toclevel) {
    this.element = el;
    this.text = text;
    this.toclevel = toclevel;
  }

  function tocEntries(el, toclevels) {
    var result = new Array;
    var re = new RegExp('[hH]([2-'+(toclevels+1)+'])');
    // Function that scans the DOM tree for header elements (the DOM2
    // nodeIterator API would be a better technique but not supported by all
    // browsers).
    var iterate = function (el) {
      for (var i = el.firstChild; i != null; i = i.nextSibling) {
        if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
          var mo = re.exec(i.tagName);
          if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
            result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
          }
          iterate(i);
        }
      }
    }
    iterate(el);
    return result;
  }

  var toc = document.getElementById("toc");
  if (!toc) {
    return;
  }

  // Delete existing TOC entries in case we're reloading the TOC.
  var tocEntriesToRemove = [];
  var i;
  for (i = 0; i < toc.childNodes.length; i++) {
    var entry = toc.childNodes[i];
    if (entry.nodeName == 'div'
     && entry.getAttribute("class")
     && entry.getAttribute("class").match(/^toclevel/))
      tocEntriesToRemove.push(entry);
  }
  for (i = 0; i < tocEntriesToRemove.length; i++) {
    toc.removeChild(tocEntriesToRemove[i]);
  }

  // Rebuild TOC entries.
  var entries = tocEntries(document.getElementById("content"), toclevels);
  for (var i = 0; i < entries.length; ++i) {
    var entry = entries[i];
    if (entry.element.id == "")
      entry.element.id = "_toc_" + i;
    var a = document.createElement("a");
    a.href = "#" + entry.element.id;
    a.appendChild(document.createTextNode(entry.text));
    var div = document.createElement("div");
    div.appendChild(a);
    div.className = "toclevel" + entry.toclevel;
    toc.appendChild(div);
  }
  if (entries.length == 0)
    toc.parentNode.removeChild(toc);
},


/////////////////////////////////////////////////////////////////////
// Footnotes generator
/////////////////////////////////////////////////////////////////////

/* Based on footnote generation code from:
 * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
 */

footnotes: function () {
  // Delete existing footnote entries in case we're reloading the footnodes.
  var i;
  var noteholder = document.getElementById("footnotes");
  if (!noteholder) {
    return;
  }
  var entriesToRemove = [];
  for (i = 0; i < noteholder.childNodes.length; i++) {
    var entry = noteholder.childNodes[i];
    if (entry.nodeName == 'div' && entry.getAttribute("class") == "footnote")
      entriesToRemove.push(entry);
  }
  for (i = 0; i < entriesToRemove.length; i++) {
    noteholder.removeChild(entriesToRemove[i]);
  }

  // Rebuild footnote entries.
  var cont = document.getElementById("content");
  var spans = cont.getElementsByTagName("span");
  var refs = {};
  var n = 0;
  for (i=0; i<spans.length; i++) {
    if (spans[i].className == "footnote") {
      n++;
      var note = spans[i].getAttribute("data-note");
      if (!note) {
        // Use [\s\S] in place of . so multi-line matches work.
        // Because JavaScript has no s (dotall) regex flag.
        note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
        spans[i].innerHTML =
          "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
          "' title='View footnote' class='footnote'>" + n + "</a>]";
        spans[i].setAttribute("data-note", note);
      }
      noteholder.innerHTML +=
        "<div class='footnote' id='_footnote_" + n + "'>" +
        "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
        n + "</a>. " + note + "</div>";
      var id =spans[i].getAttribute("id");
      if (id != null) refs["#"+id] = n;
    }
  }
  if (n == 0)
    noteholder.parentNode.removeChild(noteholder);
  else {
    // Process footnoterefs.
    for (i=0; i<spans.length; i++) {
      if (spans[i].className == "footnoteref") {
        var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
        href = href.match(/#.*/)[0];  // Because IE return full URL.
        n = refs[href];
        spans[i].innerHTML =
          "[<a href='#_footnote_" + n +
          "' title='View footnote' class='footnote'>" + n + "</a>]";
      }
    }
  }
},

install: function(toclevels) {
  var timerId;

  function reinstall() {
    asciidoc.footnotes();
    if (toclevels) {
      asciidoc.toc(toclevels);
    }
  }

  function reinstallAndRemoveTimer() {
    clearInterval(timerId);
    reinstall();
  }

  timerId = setInterval(reinstall, 500);
  if (document.addEventListener)
    document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
  else
    window.onload = reinstallAndRemoveTimer;
}

}
asciidoc.install(2);
/*]]>*/
</script>
</head>
<body class="article">
<div id="header">
<h1>Release notes for Gerrit 2.3</h1>
<span id="revnumber">version 2.3 (from v2.7-rc2-530-g4d7ac77)</span>
<div id="toc">
  <div id="toctitle">Table of Contents</div>
  <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
</div>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph"><p>Gerrit 2.3 is now available:</p></div>
<div class="paragraph"><p><a href="http://code.google.com/p/gerrit/downloads/detail?name=gerrit-2.3.war">http://code.google.com/p/gerrit/downloads/detail?name=gerrit-2.3.war</a></p></div>
</div>
</div>
<div class="sect1">
<h2 id="_schema_change">Schema Change</h2>
<div class="sectionbody">
<div class="paragraph"><p><strong>WARNING:</strong> This release contains schema changes.  To upgrade:</p></div>
<div class="listingblock">
<div class="content">
<pre><tt>  java -jar gerrit.war init -d site_path</tt></pre>
</div></div>
<div class="paragraph"><p><strong>WARNING:</strong> Upgrading to 2.3.x requires the server be first upgraded
to 2.1.7 (or a later 2.1.x version), and then to 2.3.x.</p></div>
<div class="paragraph"><p>If you are upgrading from 2.2.x.x, you may ignore this warning and
upgrade directly to 2.3.x.</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_new_features">New Features</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_drafts">Drafts</h3>
<div class="ulist"><ul>
<li>
<p>
New draft statuses and magic branches
</p>
<div class="paragraph"><p>Adds draft status to Change. DRAFT status in change occurs before NEW
and will be for a change that is not meant for review (yet).
Also adds magic branches refs/drafts/ and refs/publish/ that
will handle whether or not a patchset is a draft or goes straight to
review. refs/for/ should be deprecated in favor of explicitly marking
a patchset as a draft or directly to review.</p></div>
</li>
<li>
<p>
Draft patchset and change visibility in UI
</p>
<div class="paragraph"><p>If a patchset is a draft, adds a (DRAFT) label next to the revision
(or gitweb link if it exists). If a change is a draft, adds a (DRAFT)
next to the subject and changes the status appropriately.</p></div>
</li>
<li>
<p>
Publish draft patchsets in UI and SSH
</p>
<div class="paragraph"><p>Adds Publish button to draft patchsets in UI and an option to
publish draft patchsets in the review ssh command. Publishing a draft
patchset makes it visible. Publishing a draft patchset in a draft
change irreversibly upgrades the change status to NEW.</p></div>
</li>
<li>
<p>
Delete draft changes and patchsets
</p>
<div class="paragraph"><p>Adds ability to delete draft changes and patchsets that are not meant
or fit for code review. Deleting a draft patchset also deletes the
corresponding ref from the repository and decrements the next patch
set number for the change if necessary. Deleting a draft change
deletes all of its (draft) patchsets.</p></div>
</li>
<li>
<p>
Add pushing drafts to refs/drafts/
</p>
<div class="paragraph"><p>Pushing to refs/drafts/ will now push a draft patchset. If this is the
first patch set, change created will be in draft status. Pushing a
draft patchset to a draft change keeps it in draft status. Pushing
a non-draft patchset (with refs/publish/ or refs/for/, they do the
same thing) to a draft change turns it into a non-draft change.
Draft patchsets cannot be submitted.</p></div>
</li>
<li>
<p>
When pushing changes as drafts, output [DRAFT] next to the change link
</p>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_web">Web</h3>
<div class="ulist"><ul>
<li>
<p>
issue 203 Create project through web interface
</p>
<div class="paragraph"><p>Add a new panel in the Admin&#8594;Projects Screen.  It
enables the users that are allowed to create projects
via command-line to create them also via web interface.</p></div>
</li>
<li>
<p>
Suggest parent for <em>create-project</em> in the UI.
</p>
<div class="paragraph"><p>Add a list of parent suggestions for <em>create project</em>
in the UI, so the user can select a parent for the new
project from a list of projects that are already parents to
other projects.</p></div>
</li>
<li>
<p>
issue 981 Fix diffs skipping one line
</p>
<div class="paragraph"><p>Don&#8217;t show <em>&#8230; skipping 1 common line &#8230;</em>.  The text to show this
takes up just as much space as showing the line which was skipped.</p></div>
</li>
<li>
<p>
issue 18 Support expanding lines of context in diff
</p>
<div class="paragraph"><p>Allow lines of context which were skipped in the side-by-side diff
view to be expanded.  This makes it easier to get more code context
when needed but not show huge amounts of unneeded data.</p></div>
</li>
<li>
<p>
Move checkbox to mark file as reviewed into title bar
</p>
</li>
<li>
<p>
Redirect the user to the reverted change (when reverting).
</p>
</li>
<li>
<p>
On group rename update the group name in the page title
</p>
</li>
<li>
<p>
In ProjectAccessScreen add link to history of project.config in gitweb
</p>
</li>
<li>
<p>
Removed superfluous <em>comment</em> for patch history table.
</p>
</li>
<li>
<p>
Make OpenID login images transparent
</p>
</li>
<li>
<p>
Disable SSH Keys in the web UI if SSHD is disabled
</p>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_ssh">SSH</h3>
<div class="ulist"><ul>
<li>
<p>
Adds --description (-d) option to ls-projects
</p>
<div class="paragraph"><p>Allows listing of projects together with their respective
description.</p></div>
</li>
<li>
<p>
ls-projects: new option to list all accessible projects
</p>
<div class="paragraph"><p>Add a new option <em>--all</em> to the <em>ls-projects</em> SSH command to display
all projects that are accessible by the calling user account. Besides
the projects that the calling user account has been granted <em>READ</em>
access to, this includes all projects that are owned by the calling
user account (even if for these projects the <em>READ</em> access right is
not assigned to the calling user account).</p></div>
</li>
<li>
<p>
Suggest parent for <em>create-project</em> in the SSH command
</p>
<div class="paragraph"><p>Add an option <em>--suggest-parents</em> which will print out
a list of projects that are already parents to another
projects, thus it can help user to find a suitable
parent for the new project.</p></div>
</li>
<li>
<p>
Support reparenting all children of a parent project
</p>
<div class="paragraph"><p>This change adds a new option to the <em>set-project-parent</em> command that
allows reparenting all child projects of one parent project to another
parent project.</p></div>
</li>
<li>
<p>
set-parent-project: evict child projects from project cache
</p>
</li>
<li>
<p>
Add ssh command to list groups.
</p>
</li>
<li>
<p>
ls-groups: add option to list groups for a project
</p>
<div class="paragraph"><p>Add an option to the ls-groups SSH command that allows to list only
those groups for which any permission is assigned to a project.</p></div>
</li>
<li>
<p>
ls-groups: Add option to only list groups that are visible to all
</p>
</li>
<li>
<p>
ls-groups: Support listing groups by group type
</p>
</li>
<li>
<p>
ls-groups: Support listing of groups for a user
</p>
</li>
<li>
<p>
Add new SSH command to rename groups
</p>
</li>
<li>
<p>
Support for --file option for ssh queries.
</p>
<div class="paragraph"><p>Allows user to list files and attributes (ADDED,
MODIFIED, DELETED, RENAMED, COPIED) when querying for
patch sets.</p></div>
</li>
<li>
<p>
Output full commit message in query results
</p>
</li>
<li>
<p>
Option for SSHD review-cmd to always publish the message.
</p>
<div class="paragraph"><p>"--force-message" option for the SSHD review command,
which allows Gerrit to publish the "--message", even if the
labels could not be applied due to change being closed.</p></div>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_config">Config</h3>
<div class="ulist"><ul>
<li>
<p>
issue 349 Apply states for projects (active, readonly and hidden)
</p>
<div class="paragraph"><p>Active state indicates the project is regular and is the default value.</p></div>
<div class="paragraph"><p>Read Only means that users can see the project if read permission is
granted, but all modification operations are disabled.</p></div>
<div class="paragraph"><p>Hidden means the project is not visible for those who are not owners</p></div>
</li>
<li>
<p>
Enable case insensitive login to Gerrit WebUI for LDAP authentication
</p>
<div class="paragraph"><p>Gerrit treats user names as case sensitive, while some LDAP servers
don&#8217;t. On first login to Gerrit the user enters his user name and
Gerrit queries LDAP for it. Since LDAP is case-insensitive with regards
to  the username, the LDAP authentication succeeds regardless in
which case the user typed in his user name. The username is stored in
Gerrit exactly as entered by the user. For further logins the user
always has to use the same case. If the user specifies his user name in
a different case Gerrit tries to create a new account which fails with
"Cannot assign user name &#8230; to account &#8230;; name already in use.".
This error occurs because the LDAP query resolves to the same LDAP
user and storing the username for SSH (which is by default always
lower case) fails because such an entry exists already for the first
account that the user created.</p></div>
<div class="paragraph"><p>This change introduces a new configuration parameter that converts the
user name always to lower case before doing the LDAP authentication.
By this the login to the Gerrit WebUI gets case insensitive. If this
configuration parameter is set, the user names for all existing
accounts have to be converted to lower case. This change includes a
server program to do this conversion.</p></div>
</li>
<li>
<p>
Enable case insensitive authentication for git operations
</p>
<div class="paragraph"><p>A new configuration parameter is introduced that converts the username
that is received to authenticate a git operation to lower case for
looking up the user account in Gerrit.</p></div>
<div class="paragraph"><p>By setting this parameter a case insensitive authentication for the
git operations can be achieved, if it is ensured that the usernames in
Gerrit (scheme <em>username</em>) are stored in lower case (e.g. if the
parameter <em>ldap.accountSshUserName</em> is set to
<em>${sAMAccountName.toLowerCase}</em>).</p></div>
</li>
<li>
<p>
Support replication to local folder
</p>
</li>
<li>
<p>
Read timeout parameter for LDAP connections: ldap.readTimeout
</p>
<div class="paragraph"><p>This helps prevent a very slow LDAP server from blocking
all SSH command creation threads.</p></div>
</li>
<li>
<p>
Introduce a git maxObjectSizeLimit in the [receive] config
</p>
<div class="paragraph"><p>This limits the size of uploaded files</p></div>
</li>
<li>
<p>
Make <em>Anonymous Coward</em> configurable
</p>
</li>
<li>
<p>
Add property to configure path separator in URLs for a gitweb service
</p>
</li>
<li>
<p>
Customize link-name pointing to gitweb-service.
</p>
<div class="paragraph"><p>Previously the link to the external gitweb-type
pages said "(gitweb)" regardless if using cgit
or a custom service.</p></div>
</li>
<li>
<p>
Support gitweb.type=disabled
</p>
</li>
<li>
<p>
rules.enable: Support disabling per project prolog rules in gerrit.config
</p>
</li>
<li>
<p>
Allow site administrators to define Git-over-HTTP mirror URL
</p>
</li>
<li>
<p>
Allow sshd.listenAddress = off to disable the daemon
</p>
</li>
<li>
<p>
daemon: Allow httpd without sshd
</p>
</li>
<li>
<p>
Allow disabling certain features of HostPageServlet
</p>
<div class="paragraph"><p>These features are: user agent detection and automatic refresh
logic associated with the site header, footer and CSS.</p></div>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_dev">Dev</h3>
<div class="ulist"><ul>
<li>
<p>
Fix <em>No source code is available for type org.eclipse.jgit.lib.Constants</em>
</p>
</li>
<li>
<p>
Fix miscellaneous compiler warnings
</p>
</li>
<li>
<p>
Add entries to .gitignore for m2e settings/preference files
</p>
</li>
<li>
<p>
Package source JARs for antlr, httpd, server
</p>
</li>
<li>
<p>
pom.xml: change gerrit-war&#8217;s dependency on gerrit-main to runtime
</p>
<div class="paragraph"><p>This only seems to matter to IntelliJ, since the Main class is
provided to the war via an overlay in gerrit-war/pom.xml</p></div>
</li>
<li>
<p>
Fixed the full name of the MAVEN2_CLASSPATH_CONTAINER
</p>
<div class="paragraph"><p>Fixes java.lang.NoClassDefFoundError: com/google/gwt/dev/DevMode</p></div>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_miscellaneous">Miscellaneous</h3>
<div class="ulist"><ul>
<li>
<p>
Allow superprojects to subscribe to submodules updates
</p>
<div class="paragraph"><p>The feature introduced in this release allows superprojects to
subscribe to submodules updates.</p></div>
<div class="paragraph"><p>When a commit is merged to a project, the commit content is scanned
to identify if it registers submodules (if the commit contains new
gitlinks and .gitmodules file with required info) and if so, a new
submodule subscription is registered.</p></div>
<div class="paragraph"><p>When a new commit of a registered submodule is merged, gerrit
automatically updates the subscribers to the submodule with new
commit having the updated gitlinks.</p></div>
<div class="paragraph"><p>The most notable benefit of the feature is to not require
to push/merge commits of super projects (subscribers) with gitlinks
whenever a project being a submodule is updated. It is only
required to push commits with gitlinks when they are created
(and in this case it is also required to push .gitmodules file).</p></div>
</li>
<li>
<p>
Allow Realm to participate when linking an account identity
</p>
<div class="paragraph"><p>When linking a new user identity to an existing account, permit the
Realm to observe the new incoming identity and the current account,
and to alter the request. This enables a Realm to observe when a
user verifies a new email address link.</p></div>
</li>
<li>
<p>
issue 871 Show latest patchset with cherry-picked merge
</p>
<div class="paragraph"><p>When a change is published via the cherry-pick merge strategy,
show the final commit as a patchset in the change history.
This now makes it possible to search for the cherry-picked SHA1.</p></div>
</li>
<li>
<p>
issue 871 Display hash of the cherry-pick merge in comment
</p>
</li>
<li>
<p>
Added more verbose messages when changes are being rejected
</p>
</li>
<li>
<p>
Display proper error message when LDAP is unavailable
</p>
</li>
<li>
<p>
Clarify error msg when user&#8217;s not allowed to <em>--force push</em>.
</p>
</li>
<li>
<p>
ContainerAuthFilter: fail with FORBIDDEN if username not set
</p>
</li>
<li>
<p>
Resolve <em>Project Owners</em> group if it is included into another group
</p>
</li>
<li>
<p>
Hide SSH URL in email footers if SSH is disabled
</p>
</li>
<li>
<p>
Sort the jar files from the war before adding to classpath.
</p>
</li>
<li>
<p>
Apply user preferences when loading site
</p>
</li>
<li>
<p>
Ensure HttpLog can always get the user identity
</p>
</li>
<li>
<p>
Prevent comments spam for abandoned commit
</p>
<div class="paragraph"><p>If some change was abandoned but later submitted (e.g. by
cherry-picking it to a another branch) then pushing a new branch
that contains this change no longer adds a new comment.</p></div>
</li>
<li>
<p>
Make Address, EmailHeader visible to other EmailSenders
</p>
</li>
<li>
<p>
Use transactions to handle comments when possible
</p>
</li>
<li>
<p>
Try to use transactions when creating changes
</p>
</li>
<li>
<p>
gerrit.sh: disown doesn&#8217;t accept pid as a argument, fix script
</p>
</li>
<li>
<p>
gerrit.sh: detach gerrit properly so it won&#8217;t keep bad ssh sessions open.
</p>
</li>
<li>
<p>
Cache list of all groups in the group cache
</p>
</li>
<li>
<p>
issue 1161 Evict project in user cache on save of project meta data
</p>
</li>
<li>
<p>
Ensure that the site paths are resolved to their canonical form (for Windows)
</p>
</li>
<li>
<p>
Connect Velocity to slf4j
</p>
</li>
<li>
<p>
Expose project permissionOnly status via JSON-RPC
</p>
</li>
<li>
<p>
Make HEAD of All-Projects point to refs/meta/config
</p>
</li>
<li>
<p>
issue 1158 Added support for European style dates
</p>
</li>
<li>
<p>
Make macros in email templates local to the template
</p>
</li>
<li>
<p>
Support <a href="http://server/project">http://server/project</a> for Git access
</p>
</li>
<li>
<p>
Use _ instead of $ for implementation-detail Prolog predicates
</p>
</li>
<li>
<p>
Update the Sign In anchor with current URL
</p>
<div class="paragraph"><p>Always update the href of the Sign In anchor in the menu bar with
the current page URL after /login/, making the redirect process
bring users back to the current view after sign in.</p></div>
</li>
<li>
<p>
Improve validation of email registration tokens
</p>
</li>
</ul></div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_upgrades">Upgrades</h2>
<div class="sectionbody">
<div class="ulist"><ul>
<li>
<p>
Upgrade to gwtorm 1.2
</p>
</li>
<li>
<p>
Upgrade to JGit 1.1.0.201109151100-r.119-gb4495d1
</p>
<div class="paragraph"><p>This is needed because of this change:
<a href="https://gerrit-review.googlesource.com/#/c/30450/">https://gerrit-review.googlesource.com/#/c/30450/</a></p></div>
</li>
<li>
<p>
Support Velocity 1.5 (as well as previous 1.6.4)
</p>
</li>
</ul></div>
</div>
</div>
<div class="sect1">
<h2 id="_bug_fixes">Bug Fixes</h2>
<div class="sectionbody">
<div class="ulist"><ul>
<li>
<p>
Avoid NPE when group is missing
</p>
</li>
<li>
<p>
Do not fail with NPE if context path of request is null
</p>
</li>
<li>
<p>
Fix NPE in set-project-parent command if parent is not specified
</p>
</li>
<li>
<p>
Only send mail to author and committer if they are registered to prevent an NPE
</p>
</li>
<li>
<p>
Avoid potential NPE when querying the queue.
</p>
</li>
<li>
<p>
Allow loading Project Access when there is no refs/meta/config
</p>
</li>
<li>
<p>
Fix calculation of project name if repo is not existing
</p>
<div class="paragraph"><p>If a project inherits from a non existing parent, prevent a
StringIndexOutOfBoundsException.</p></div>
</li>
<li>
<p>
Fix: Suppress "Error on refs/cache-automerge" warnings.
</p>
</li>
<li>
<p>
Don&#8217;t allow registering for cleanup after cleanup runs
</p>
<div class="paragraph"><p>This prevents leaking a database connection.</p></div>
</li>
<li>
<p>
issue 807 Fix: Tags are not replicated properly
</p>
</li>
<li>
<p>
Prevent smtp rejected users from rejecting emails for all users
</p>
</li>
<li>
<p>
Fix token saving redirect in container auth
</p>
<div class="paragraph"><p>Update the jump page that redirects users from /#TOKEN to
/login/TOKEN.  This forces using the container based
authentication.  Also correct "/login//" to be just "/login/".</p></div>
</li>
<li>
<p>
Use custom error messages for Git-over-HTTP
</p>
<div class="paragraph"><p>Ensure clients see messages related to contributor agreement not
being activated even if they push over HTTP.</p></div>
</li>
<li>
<p>
Avoid double key event for GroupReferenceBox
</p>
</li>
<li>
<p>
Fix git push authentication over HTTP
</p>
</li>
<li>
<p>
Fix <a href="http://login/">http://login/</a> redirect bug
</p>
</li>
<li>
<p>
Fix missing targets in /login/ URLs
</p>
</li>
<li>
<p>
set-project-parent: if update of 1 project fails continue with others
</p>
</li>
<li>
<p>
Verify the case of the project name before opening git repository
</p>
</li>
<li>
<p>
Update top level SUBMITTING_PATCHES URLs
</p>
</li>
</ul></div>
</div>
</div>
<div class="sect1">
<h2 id="_documentation">Documentation</h2>
<div class="sectionbody">
<div class="ulist"><ul>
<li>
<p>
Some updates to the design docs
</p>
</li>
<li>
<p>
cmd-index: Fix link to documentation of rename-group command
</p>
</li>
<li>
<p>
Update documentation for testing SSH connection
</p>
</li>
<li>
<p>
Bypass review updated with 2.2.x permissions
</p>
</li>
<li>
<p>
Add documentation for <em>peer_keys</em>
</p>
</li>
<li>
<p>
Improve <em>Push Merge Commit</em> access right documentation
</p>
</li>
<li>
<p>
Access control: Capabilities documented
</p>
<div class="ulist"><ul>
<li>
<p>
Administrate Server
</p>
</li>
<li>
<p>
Create Account
</p>
</li>
<li>
<p>
Create Group
</p>
</li>
<li>
<p>
Create Project
</p>
</li>
<li>
<p>
Flush Caches
</p>
</li>
<li>
<p>
Kill Task
</p>
</li>
<li>
<p>
Priority
</p>
</li>
<li>
<p>
Query Limit
</p>
</li>
<li>
<p>
Start Replication
</p>
</li>
<li>
<p>
View caches
</p>
</li>
<li>
<p>
View connections
</p>
</li>
<li>
<p>
View queue
</p>
</li>
</ul></div>
</li>
<li>
<p>
Access control: Example roles documented
</p>
<div class="ulist"><ul>
<li>
<p>
Contributor
</p>
</li>
<li>
<p>
Developer
</p>
</li>
<li>
<p>
CI System
</p>
</li>
<li>
<p>
Integrator
</p>
</li>
<li>
<p>
Project owner
</p>
</li>
<li>
<p>
Administrator
</p>
</li>
</ul></div>
</li>
</ul></div>
</div>
</div>
</div>
<div id="footnotes"><hr /></div>
<div id="footer">
<div id="footer-text">
Version 2.3 (from v2.7-rc2-530-g4d7ac77)<br />
Last updated 2013-10-08 10:02:12 PDT
</div>
</div>
</body>
</html>
